package com.droid.faces;

import com.droid.persistor.dao.Categoria;
import com.droid.persistor.dao.Gasto;
import com.droid.persistor.dao.Objetivo;
import com.droid.persistor.dao.Recordatorio;
import com.droid.persistor.dao.Tipo_Gasto;
import com.droid.persistor.dao.Usuario;
import com.droid.persistor.facade.PersistorFacade;
import com.droid.users.facade.UsuarioFacade;

import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import javax.el.ValueExpression;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import java.io.Serializable;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpSession;

import org.primefaces.component.column.Column;
import org.primefaces.component.datatable.DataTable;
import org.primefaces.component.datatable.feature.SortFeature;
import org.primefaces.event.RowEditEvent;
import org.primefaces.model.SortOrder;

@ManagedBean
@SessionScoped
public class AutoCompleteBean implements Serializable {
	private Tipo_Gasto Tipo_GastoSeleccionado = null;
	private Gasto GastoSeleccionado = null;
	private PersistorFacade pFacade = new PersistorFacade();
	private List<Tipo_Gasto> Tipo_Gastos = pFacade.getListaTipoGasto();
	private static final String perioricidadString = "DIARIO,SEMANAL,MENSUAL,ANUAL";
	private static String[] perioricidadArray = perioricidadString.split(",");
	private String perioricidad= null;;
	private Categoria CategoriaSeleccionado= null;;
//	private List<Categoria> Categorias = new ArrayList<Categoria>();
	private List<Categoria> Categorias = pFacade.getListaCategorias();
	private String monto, mensaje, nombreTipoGasto= null;;
	private UserHolder uh= null;;
	private Date registroDate= null;;
	private Number numeroTipoGasto= null;;
	protected DataTable table= null;;
	

	protected void refrestTableComponentOrder(DataTable table) {
	    FacesContext facesContext = FacesContext.getCurrentInstance();
	    //When view is not created, like on first call when preparing the model, table will not be found
	    if(table == null){
	        return;
	    }
	    ValueExpression tableSortByVe = table.getValueExpression("sortBy");
	    String tableSortByExpression = tableSortByVe.getExpressionString();

	    //Loop on children, that are the columns, to find the one whose order must be applied.
	    for (UIComponent child : table.getChildren()) {
	        Column column = (Column)child;
	        ValueExpression columnSortByVe = column.getValueExpression("sortBy");
	        if (columnSortByVe != null) {
	            String columnSortByExpression = columnSortByVe.getExpressionString();

	            if (tableSortByExpression != null && tableSortByExpression.equals(columnSortByExpression)) {
	                //Now sort table content
	                SortFeature sortFeature = new SortFeature();
//	                sortFeature.sort(facesContext, table, tableSortByVe, table.getVar(),SortOrder.valueOf(table.getSortOrder().toUpperCase(Locale.ENGLISH)), table.getSortFunction());
	                break;
	            }
	        }

	    }
	}
	
	public AutoCompleteBean() {
		super();
	}
	
	public String getMonto() {
		return monto;
	}

	public String getNombreTipoGasto() {
		return nombreTipoGasto;
	}

	public void setNombreTipoGasto(String nombreTipoGasto) {
		this.nombreTipoGasto = nombreTipoGasto;
	}

	public void setMonto(String monto) {
		this.monto = monto;
	}

	public String getPerioricidad() {
		return perioricidad;
	}

	public void setPerioricidad(String perioricidad) {
		this.perioricidad = perioricidad;
	}

	public void onEdit(RowEditEvent event) {
		// System.out.println("car.edit" + ((Gasto)
		// event.getObject()).getIdGasto());

		try {

//			System.out.println("Entro edit ");
			Gasto gtoform = (Gasto) event.getObject();

			DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
			Date hoydate = new Date();

			FacesContext context = FacesContext.getCurrentInstance();

			if (!hoydate.before(getDate())) {
				FacesMessage errorMessage = new FacesMessage(
						"La fecha de registro deber ser mayor a hoy");
				errorMessage.setSeverity(FacesMessage.SEVERITY_ERROR);
				context.addMessage(null, errorMessage);

				System.out.print("Entro if Fecha" + getDate() + "fecha hoy"
						+ hoydate);

			} else {

				gtoform.setMonto(this.monto);
				gtoform.setFecha(dateFormat.format(hoydate));
				gtoform.setPerioricidad(this.perioricidad);
				gtoform.setTipo_Gasto(Tipo_GastoSeleccionado.getIdTipo_Gasto());

				PersistorFacade facade = new PersistorFacade();

				facade.updateGasto(gtoform);
			}

		} catch (Exception e) {
			// Mensagens...
//			System.out.println("Entro edit error");

		}
	}

	public void eliminarGasto(Number idgasto) {

//		System.out.println("Entro eliminar gasto ");

		try {

//			System.out.println("Entro eliminar gasto 2");
//			Gasto gtoform = (Gasto) table.getRowData();

			FacesContext context = FacesContext.getCurrentInstance();

			PersistorFacade facade = new PersistorFacade();

			if (idgasto != null) {

				facade.deleteGasto(idgasto);

				Recordatorio reco = facade.getRecordatorioGasto(idgasto);

				if (reco.getIdRecordatorio() != null) {
					facade.deleteRecordatorio(reco.getIdRecordatorio());
				}
			}

		} catch (Exception e) {
			// Mensagens...
//			System.out.println("Entro edit error");

		}
	}

	// Tipo de gastos
	public Tipo_Gasto getTipo_GastoSelecionado() {
		return Tipo_GastoSeleccionado;
	}

	public static String[] getPerioricidadarray() {
		return perioricidadArray;
	}

	public String[] getListPerio() {
		return perioricidadArray;
	}

	public static void setPerioricidadarray(String[] pero) {
		perioricidadArray = pero;
	}

	public void setTipo_GastoSelecionado(Tipo_Gasto Tipo_GastoSeleccionado) {
		this.Tipo_GastoSeleccionado = Tipo_GastoSeleccionado;
	}

	public List<Tipo_Gasto> getTipo_Gastos() {
		return Tipo_Gastos;
	}

	public void setTipo_Gastos(List<Tipo_Gasto> Tipo_Gastos) {
		this.Tipo_Gastos = Tipo_Gastos;
	}

	public List<Tipo_Gasto> completaNombreTG(String query) {
	//	this.Tipo_Gastos = pFacade.getListaTipoGasto();

		List<Tipo_Gasto> sugerencias = new ArrayList<Tipo_Gasto>();
		for (Tipo_Gasto j : this.Tipo_Gastos) {
			if (j.getNombre().toUpperCase().startsWith(query.toUpperCase())) {
			sugerencias.add(j);
			}
		}
		return sugerencias;
			
	}

	// Perioricidad

	public String getperioricidad() {
		return (perioricidad);
	}

	public void setperioricidad(String perioricidad) {
		this.perioricidad = perioricidad;
	}

	public List<String> completeperioricidad(String perioricidadPrefix) {
		List<String> matches = new ArrayList<String>();
		for (String possibleperioricidad : perioricidadArray) {
			if (possibleperioricidad.toUpperCase().startsWith(
					perioricidadPrefix.toUpperCase())) {
				matches.add(possibleperioricidad);
			}
		}
		return (matches);
	}

	// Categorias
	public Categoria getCategoriaSeleccionado() {
		return CategoriaSeleccionado;
	}

	public void setCategoriaSeleccionado(Categoria CategoriaSeleccionado) {
		this.CategoriaSeleccionado = CategoriaSeleccionado;
	}

	public List<Categoria> getCategorias() {

		return Categorias;
	}

	public List<Gasto> getListaGastos() {

		LoginRequest lgt = (LoginRequest) FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap().get("loginRequest");
		PersistorFacade facade = new PersistorFacade();
//		 Usuario usu = facade.obtenerUsuario(lgt.getUsername());

		PersistorFacade pFacade = new PersistorFacade();

//		 ArrayList<Gasto> ctg = pFacade.obtenerUsuarioGastos(usu.getEmail());
		ArrayList<Gasto> ctg = pFacade.obtenerUsuarioGastos("pmail@gmail.com");
		
		

		return ctg;

	}

	public List<Tipo_Gasto> getListaTipoGastos() {

		LoginRequest lgt = (LoginRequest) FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap().get("loginRequest");
		PersistorFacade facade = new PersistorFacade();
		// Usuario usu = facade.obtenerUsuario(lgt.getUsername());

		PersistorFacade pFacade = new PersistorFacade();

		// ArrayList<Gasto> ctg = pFacade.obtenerUsuarioGastos(usu.getEmail());
		ArrayList<Tipo_Gasto> tgo = pFacade.getListaTipoGasto();

		return tgo;

	}

	public void setCategorias(List<Categoria> Categorias) {
		this.Categorias = Categorias;
	}

	public List<Categoria> completaNombreCategoria(String query) {

//		this.Categorias = pFacade.getListaCategorias();

		List<Categoria> sugerencias = new ArrayList<Categoria>();
		for (Categoria j : this.Categorias) {
			if (j.getNombre().toUpperCase().startsWith(query.toUpperCase())) {
			sugerencias.add(j);
			}
		}
		return sugerencias;
	}

	// Date
	public Date getDate() {
		return registroDate;
	}

	public void setDate(Date rdate) {
		this.registroDate = rdate;
	}

	// Mensaje

	public String getMensaje() {
		return mensaje;
	}

	public void setMensaje(String mensaje) {
		this.mensaje = mensaje;
	}

	public String gastoAltaProgramada() {
		LoginRequest lgt = (LoginRequest) FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap().get("loginRequest");
		Gasto gto = new Gasto();
		String msg = null;
		DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		Date hoydate = new Date();

		FacesContext context = FacesContext.getCurrentInstance();

		if (!hoydate.before(getDate())) {
			FacesMessage errorMessage = new FacesMessage(
					"La fecha de registro deber ser mayor a hoy");
			errorMessage.setSeverity(FacesMessage.SEVERITY_ERROR);
			context.addMessage(null, errorMessage);

			System.out.print("Entro if Fecha" + getDate() + "fecha hoy"
					+ hoydate);

			return (null);
		} else {

			PersistorFacade facade = new PersistorFacade();
			Tipo_Gasto tgo = facade.getTipo_Gasto(Tipo_GastoSeleccionado
					.getNombre());
			Categoria ctg = facade.getCategoria(CategoriaSeleccionado
					.getNombre());
			Usuario usu = facade.obtenerUsuario(lgt.getUsername());
			// Usuario usu = facade.obtenerUsuario("pmail@gmail.com");

			gto.setCategoria(ctg.getIdCategoria());
			gto.setTipo_Gasto(tgo.getIdTipo_Gasto());
			gto.setIdUsuario(usu.getIdUsuario());
			gto.setFecha(dateFormat.format(hoydate));
			gto.setPerioricidad(perioricidad);
			gto.setMonto(this.monto);

			facade.altaGasto(gto);

			Recordatorio reco = new Recordatorio();

			String rDate = dateFormat.format(getDate());

			reco.setFecha(rDate);
			reco.setIdGasto(gto.getIdgasto());
			reco.setMensaje(this.mensaje);
			reco.setNombre(tgo.getNombre());
			reco.setIdUsuario(gto.getIdUsuario());

			facade.altaRecordatorio(reco);

			/*
			 * System.out.print( "Alta gasto programada--> " + "Categoria: " +
			 * gto.getCategoria() + " Tipo_Gasto: " + gto.getTipo_Gasto() +
			 * " Idusuario: " + gto.getIdUsuario() + " FechaAlta: " +
			 * gto.getFecha() + " Perioricidad: " + gto.getPerioricidad() +
			 * " Monto: " + gto.getMonto() + " FechaProgramada " +
			 * reco.getFecha() + "Usuario " + usu.getEmail());
			 */
			limpiarForm();

			return ("menu");
		}

	}

	// public String eliminarGasto() {
	// String msg = null;
	//
	// PersistorFacade facade = new PersistorFacade();
	// Gasto gto = facade.getGasto(GastoSeleccionado.getIdgasto());
	//
	// if (gto.getIdgasto() != null) {
	//
	// facade.deleteGasto(gto.getIdgasto());
	//
	// msg = "Gasto borrado " + "Categoria: " + gto.getCategoria()
	// + " Tipo_Gasto: " + gto.getTipo_Gasto() + " Idusuario: "
	// + gto.getIdUsuario() + " Fecha: " + gto.getFecha()
	// + " Perioricidad: " + gto.getPerioricidad() + " Monto: "
	// + gto.getMonto();
	//
	// Recordatorio reco = facade.getRecordatorioGasto(GastoSeleccionado
	// .getIdgasto());
	//
	// if (reco.getIdRecordatorio() != null) {
	// facade.deleteRecordatorio(reco.getIdRecordatorio());
	// msg = msg + " Recordatorio asociado borraro"
	// + reco.getIdRecordatorio();
	// }
	//
	// } else {
	// msg = "Gasto inexistente";
	// }
	// return msg;
	// }

	public void limpiarForm(){
		this.Tipo_GastoSeleccionado = null;
		this.GastoSeleccionado = null;
		this.Tipo_Gastos = null;
		this.perioricidad =null;
		this.perioricidad= null;;
		this.CategoriaSeleccionado= null;;
		this.Categorias = null;
		this.monto=null;
		this.mensaje=null;
		this.nombreTipoGasto= null;
		this.uh= null;;
		this.registroDate= null;;
		this.numeroTipoGasto= null;;
		this.table= null;;
	}
	
	public String gastoAltaNoProgramada() {
		LoginRequest lgt = (LoginRequest) FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap().get("loginRequest");
		Gasto gto = new Gasto();
		String msg = null;
		DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		Date date = new Date();

		PersistorFacade facade = new PersistorFacade();
		Tipo_Gasto tgo = facade.getTipo_Gasto(Tipo_GastoSeleccionado
				.getNombre());
		Categoria ctg = facade.getCategoria(CategoriaSeleccionado.getNombre());
		Usuario usu = facade.obtenerUsuario(lgt.getUsername());

		gto.setCategoria(ctg.getIdCategoria());
		gto.setTipo_Gasto(tgo.getIdTipo_Gasto());
		gto.setIdUsuario(usu.getIdUsuario());
		gto.setFecha(dateFormat.format(date));
		gto.setPerioricidad(perioricidad);
		gto.setMonto(monto);

		facade.altaGasto(gto);

		// msg = "Alta gasto no programada--> " + "Categoria: "
		// + gto.getCategoria() + " Tipo_Gasto: " + gto.getTipo_Gasto()
		// + " Idusuario: " + gto.getIdUsuario() + " FechaAlta: "
		// + gto.getFecha() + " Perioricidad: " + gto.getPerioricidad()
		// + " Monto: " + gto.getMonto	|();

		System.out.println(msg);
		limpiarForm();
		return "menu";

	}
}